#include <iostream>
#include <fstream>
#include "SortingConfig.h"

using namespace std;

void swap(int &a, int &b) {
    int t=a;
    a = b;
    b = t;
}

void quik_sort_fun(int *arr, int start, int end) {
    // 递归推出条件
    if (end - start < 1) return;
    // 每一轮快排
    // 首先，选择标志元素
    // 选择k个元素的中位数作为标志元素
    if (end -start >= 2) {
        int mid = (start + end) >> 1;
        if (arr[mid] >= min(arr[start], arr[end]) && arr[mid] <= max(arr[start], arr[end])) {
            swap(arr[start], arr[mid]);
        }
        else if (arr[end] >= min(arr[start], arr[mid]) && arr[end] <= max(arr[start], arr[mid])) {
            swap(arr[start], arr[end]);
        }
    }
    int pv = arr[start];
    // 将发现的比标志元素小的数和大数进行前后交换
    // lt指向大于等于标志元素的开始下标
    int lt =start+1;
    for(int i=start+1; i <= end; ++i) {
        if (arr[i] < pv) {
            // 如果当前下标与lt相同则不执行交换，否则执行交换
            if (i != lt) swap(arr[i], arr[lt]);
            lt ++;
        }
    }
    if (start + 1 != lt) swap(arr[start], arr[lt-1]);
    quik_sort_fun(arr, start, lt-2);
    quik_sort_fun(arr, lt, end);
}

void quik_sort(int *arr, int n) {
    // 快速排序算法
    quik_sort_fun(arr, 0, n-1);
}

int main(int argc, char *argv[]) {
    cout << "Sorting Version: " << Sorting_VERSION_MAJOR 
         << "." << Sorting_VERSION_MINOR<<endl;
    // 参数解析
    ifstream input;
    if (argc > 1) {
        input.open(argv[1], ios::in);
    }

    int n;
    if (argc > 1) input >> n;
    else cin >> n;
    int arr[n];
    if (argc > 1){
        for(int i=0; i<n;++i) input >> arr[i];
        input.close();
    } else {
        for(int i=0; i<n;++i) cin >> arr[i];
    }
    // 排序
    quik_sort(arr, n);

    for(int i=0; i<n; ++i) {
        cout << arr[i] << " ";
    }
    cout << endl;

    return 0;
}